﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

//枚举
//enum color
//{
////三原色可能取值--枚举常量   枚举常量 ：可能取值都是有值的，默认从0开始，依次递增1，在声明枚举类型的时候也可以赋初值。
//	//red,//0
//	//green,//1
//	//blue//2
//
//	red=5,//给一个定值5,后面依次加1
//	green,//6
//	blue//7
//};
//enum sex//性别
//{
//	male,//0
//	female,//1
//	secret//2
//};
//int main()
//{
//	//enum color col = red;//创建变量
//	printf("%d\n", red);//0
//	printf("%d\n", green);//1
//	printf("%d\n", blue);//2
//	return 0;
//}


//动态内存管理：让程序员⾃⼰可以申请和释放空间，就⽐较灵活了
//malloc用法： void* malloc (size_t size);单位是字节。向内存申请⼀块连续可⽤的空间，并返回指向这块空间的指针（首地址）。
//int main()
//{
//	int* p = (int*)malloc(20);//申请20个字节，假设放5个整数
//	if (p == NULL)
//	{
//		perror("malloc");
//		return 1;
//	}
//	int i = 0;//使用空间
//	for (i = 0; i < 5; i++)
//	{
//		*(p+i )=i+1;
//		/* *p = i=1；
//		    i++；*/      //error因为不会指向起始地址
//	}
//	free(p);//函数free，专⻔是⽤来做动态内存的释放和回收的. void free (void* ptr);ptr是起始地址
//	p = NULL;//避免成为野指针
//
//	return 0;
//}//malloc和free都声明在stdlib.h头⽂件中。

//calloc用法：void* calloc (size_t num, size_t size);是为 num 个，⼤⼩为 size 的元素开辟⼀块空间，并且把空间的每个字节初始化为0。
//int main()
//{
//	int* p = (int*)calloc(5, sizeof(int));
//	if(p==NULL)
//	{
//		perror("calloc");
//		return 1;
//	}
//	int i = 0;
//	for (i = 0; i < 5; i++)
//	{
//		printf("%d ", *(p + i));
//	}
//	free(p);
//	p = NULL;
//	return 0;
//}

//realloc函数用法：void* realloc (void* ptr, size_t size);
//ptr 是要调整的内存地址，size 调整之后新⼤⼩， 返回值为调整之后的内存起始位置。
//int main()
//{
//	int* p = malloc(5 * sizeof(int));//20个字节
//	if (p == NULL)
//	{
//		perror("malloc");
//		return 1;
//	}
//	int i = 0;
//	for (i = 0; i < 5; i++)
//	{
//		*(p + i) = i + 1;
//	}
//	int* ptr = realloc(p, 40);//希望将空间调整为40个字节
//	if (ptr != NULL)
//	{
//		p = ptr;////接下来使用的时候40个字节空间
//		int i = 0;
//		for (i = 5; i < 10; i++)
//		{
//			*(p + i) = i + 1;
//		}
//		for (i = 0; i < 10; i++)
//		{
//			printf("%d ",*(p+i));
//		}
//		free(p);
//		p = NULL;
//	}
//	else
//	{
//		perror("realloc");//调整失败
//		free(p);
//		p = NULL;
//	}
//	return 0;
//}


//动态内存经典笔试题分析
//void GetMemory(char* p)
//void GetMemory(char** p)//修改
//{
//	p = (char*)malloc(100);//内存泄漏（无free），程序崩溃
//	*p = (char*)malloc(100);//修改
//}//p是局部变量，出去函数的时候p就会消失
//void Test(void)
//{
//	char* str = NULL;
//	GetMemory(str);//str还是空指针
//	GetMemory(&str);//修改
//	strcpy(str, "hello world");//对空指针解应用，非法访问
//	printf(str);
//	/*free(str);
//	str = NULL;*///修改
//}
//int main()
//{
//	test();
//	return 0;
//}


//char* GetMemory(void)
//{
//	char p[] = "hello world";
//	return p;//p是局部变量，返回p的地址（不可以），函数内创建，出函数销毁。
//}
//void test(void)
//{
//	char* str = NULL;
//	str = GetMemory();//函数返回后，使用str访问p是非法访问，此时str是野指针
//	printf(str);
//}
//int main()
//{
//	test();
//	return 0;
//}


//void GetMemory(char** p, int num)
//{
//	*p = (char*)malloc(num);
//}
//void Test(void)
//{
//	char* str = NULL;
//	GetMemory(&str, 100);
//	strcpy(str, "hello");
//	printf(str);//内存泄露
//}


//void Test(void)
//{
//	char* str = (char*)malloc(100);
//	strcpy(str, "hello");
//	free(str);//提前释放，str没有指向空为野指针
//	if (str != NULL)
//	{
//		strcpy(str, "world");//非法访问内存空间
//		printf(str);
//	}
//}
//int main()
//{
//	Test();
//	return 0;
//}


// 柔性数组
//struct S
//{
//	int n;
//	int arr[];
//};
//int main()
//{
//	struct S* s = malloc(sizeof(struct S) + sizeof(5 * sizeof(int)));
//	s->n = 100;
//	int i = 0;
//	for (i = 0; i < 5; i++)
//	{
//		s->arr[i] = i;
//	}
//	//调整空间
//	struct S* ptr = (struct S*)realloc(s, sizeof(struct S) + 10 * sizeof(int));
//	if (ptr != NULL)
//	{
//
//	}
//	//FREE(S);
//}

//struct S//模拟柔新数组
//{
//	int n;
//	int* arr;
//};
//int main()
//{
//	struct S* s = malloc(sizeof(struct S));
//	if (s == NULL)
//		return 1;
//	s->arr = (int*)malloc(5*sizeof(int));
//	if (s->arr == NULL)
//		return 1;
//	s->n = 100;
//	int i = 0;
//	for (i = 0; i < 5; i++)
//	{
//		s->arr[i] = i;
//	}
//	//调整数组
//	int* ptr = (int*)realloc(s->arr, 10 * sizeof(int));
//	if (ptr != NULL)
//	{
//		s->arr = ptr;
//		//使用
//	}
//	free(s->arr);
//	free(s);
//	return 0;
//}